XPath Helper助XPath爬虫一臂之力
本文作者:王碧琪
文字编辑:宁刘莹
技术总编:张 邯
XPath Helper是一款谷歌浏览器插件, 它支持在网页点击元素生成XPath。有了它,我们可以轻松快捷地找到目标信息对应的XPath节点,提取目标信息。
首先我们需要安装一下这个神器。在谷歌浏览器中的应用商店里(科学上网的情况下),搜索到XPath Helper插件,点击“添加至Chrome”即可。如果不能打开Chrome应用商店,可以通过网上的其他途径获取该插件,之后再手动添加至谷歌浏览器即可。手动添加方法是:打开谷歌浏览器扩展程序,并开启开发者模式,将该插件拖拽到浏览器里,如果不成功,可以选择“加载已解压的扩展程序”,将该文件夹先压缩再解压添加进去。
安装成功之后会发现在扩展程序中找到该插件,这就代表我们能用了。
1.点选copy XPath
现在我们打开一个标签页,以http://vip.stock.finance.sina.com.cn/corp/view/vCB_AllBulletin.php?stockid=600900&Page=1为例,我们按下F12键打开开发者模式,选择elements选项,将光标放在想要的源代码上,右键copy选项下的copy xpath,即可拷贝到选中的源代码。此处我们拷贝了包含第一条公告“长江电力关于“18长电02”公司债券回售实施结果公告”的这一行,如图片所示,得到的是://*[@id="con02-7"]/table[2]/tbody/tr/td[2]/div[1]/ul/a[1]。也就意味着我们得到了它的XPath,可以直接调用了。
2.打开控制台
3.小结
我们使用上述两种方法都得到了想要的公告标题内容,但是对应的XPath却不相同,使用copy XPath得到的是包含任意位置选取以及通配符的路径表达式,这种方式得到的表达式比较简短易读;而使用控制台得到的是从根节点一层一层精确定位得到的路径表达式,这种方式得到的表达式比较长但更易于理解。
import requests
import re
import json
from lxml import etree
url='http://vip.stock.finance.sina.com.cn/corp/view/vCB_AllBulletin.php?stockid=600900&Page=1'
headers={
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive',
'Cookie': 'U_TRS1=000000f8.4cd080b9.5d5df083.84177f98; UOR=,vip.stock.finance.sina.com.cn,; SINAGLOBAL=111.4.146.120_1566437523.249837; FINA_V_S_2=sh600900,sz000001; FIN_ALL_VISITED=00001; SUB=_2AkMqJ4d2f8NxqwJRmP4RzmzhbIR0zArEieKce3atJRMyHRl-yD9jqk1ZtRB6AaepmX38SfBYLleg_SxnVKE5fwFLuHhG; SUBP=0033WrSXqPxfM72-Ws9jqgMF55529P9D9W553hQPckTBmNzm93-kEMbP; U_TRS2=00000054.c8fc859b.5d7da9b3.e910162e; Apache=223.104.20.84_1568516532.296538; ULV=1568531555101:6:4:2:223.104.20.84_1568516532.296538:1568516530414',
'Host': 'vip.stock.finance.sina.com.cn',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
}
html=requests.get(url,headers=headers)
html.encoding='gb18030'
tree=etree.HTML(html.text)
title=tree.xpath('''/html/body/div[@class='wrap main_wrap clearfix']/div[@class='R']/div[@id='con02-7']/table[@class='table2'][2]/tbody/tr/td[2]/div[@class='datelist']/ul/a/text()''')
print(title)
这是为什么呢?小编也百思不得其解,后来发现是谷歌浏览器对网站内容进行了渲染,添加了/tbody标签。所以,只需要手动删除该标签即可。
title1=tree.xpath('''/html/body/div[@class='wrap main_wrap clearfix']/div[@class='R']/div[@id='con02-7']/table[@class='table2'][2]/tr/td[2]/div[@class='datelist']/ul/a/text()''') #控制台方法。删掉/tbody即可
print(title1)
title2=tree.xpath('//*[@id="con02-7"]/table[2]/tr/td[2]/div[1]/ul/a/text()')
print(title2)
date1=tree.xpath('//tr/td[2]/div[1]/ul/text()') #copy方法。
datelist=[''.join(date1.split()) for date1 in date1 if ''.join(date1.split()) !=""] #删除date内容中的换行符、回车符、空格等
print(datelist)
url1=tree.xpath('//*[@id="con02-7"]/table[2]/tr/td[2]/div[1]/ul/a/@href') #copy方法。删去tbody,加上href获取该属性对应的链接
print(url1)
至此我们就使用xpath helper获取了所有公告的发布日期、标题和链接了。接下来我们编写完整的程序将其保存到文件中。
import requests
import re
import json
from lxml import etree
url='http://vip.stock.finance.sina.com.cn/corp/view/vCB_AllBulletin.php?stockid=600900&Page=1'
headers={
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive',
'Cookie': 'U_TRS1=000000f8.4cd080b9.5d5df083.84177f98; UOR=,vip.stock.finance.sina.com.cn,; SINAGLOBAL=111.4.146.120_1566437523.249837; FINA_V_S_2=sh600900,sz000001; FIN_ALL_VISITED=00001; SUB=_2AkMqJ4d2f8NxqwJRmP4RzmzhbIR0zArEieKce3atJRMyHRl-yD9jqk1ZtRB6AaepmX38SfBYLleg_SxnVKE5fwFLuHhG; SUBP=0033WrSXqPxfM72-Ws9jqgMF55529P9D9W553hQPckTBmNzm93-kEMbP; U_TRS2=00000054.c8fc859b.5d7da9b3.e910162e; Apache=223.104.20.84_1568516532.296538; ULV=1568531555101:6:4:2:223.104.20.84_1568516532.296538:1568516530414',
'Host': 'vip.stock.finance.sina.com.cn',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
}
html=requests.get(url,headers=headers)
html.encoding='gb18030'
tree=etree.HTML(html.text)
date=tree.xpath('//tr/td[2]/div[1]/ul/text()') #copy xpath
datelist=[''.join(date.split()) for date in date if ''.join(date.split()) !=""]
titlelist=tree.xpath('''/html/body/div[@class='wrap main_wrap clearfix']/div[@class='R']/div[@id='con02-7']/table[@class='table2'][2]/tr/td[2]/div[@class='datelist']/ul/a/text()''')
urllist=tree.xpath('//*[@id="con02-7"]/table[2]/tr/td[2]/div[1]/ul/a/@href')
with open("g:\\daydayfund.csv","w",encoding="utf8") as f:
for date,title,url in zip(datelist,titlelist,urllist):
info=date+','+title+','+url+'\n' #日期,标题,链接
f.write(info)
Xpath helper插件小巧好用,有了它的加持,我们在网络数据获取时更加省时省力,那么看完这编推文,你学会使用xpath helper了吗?下次获取网络数据时赶快来试试它吧!
关于我们
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。